/**
 * 
 */
package com.flux.tms.tm${bean.numMain}srv.t${bean.numMain}${bean.numSub}.impl.ctrl;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.UncategorizedSQLException;
import org.springframework.stereotype.Component;

import com.flux.tms.tm${bean.numMain}srv.t${bean.numMain}${bean.numSub}.${bean.javaFlieName}CVal;
import com.flux.tms.tm${bean.numMain}srv.t${bean.numMain}${bean.numSub}.impl.service.Update${bean.javaFlieName}Service;
import com.flux.scev6.constant.CommonCVal;
import com.flux.scev6.appsecret.AppSecretService;
import com.flux.scev6.constant.CommonCVal;
import com.flux.scev6.dbopr.model.ResultObj;
import com.flux.scev6.exception.RowDataException;
import com.flux.scev6.extendopr.api.StdBizExtExecuteService;
import com.flux.scev6.function.functionhelper.BizHelper;
import com.flux.scev6.function.functionhelper.SFHelper;
import com.flux.scev6.log.biz.LogBatchNoUtil;
import com.flux.scev6.log.log4j.LogService;
import com.flux.scev6.login.LoginInfoBasicChecker;
import com.flux.scev6.login.LoginInfoUtil;
import com.flux.scev6.login.model.LoginInfoObj;
import com.flux.scev6.ons.OnsProducer;
import com.flux.scev6.ons.model.OnsMessageObj;
import com.flux.scev6.utils.*;
import com.flux.scev6.utils.datetime.DateTimeUtil;

/**
 * 
 * T${bean.numMain}${bean.numSub} ${bean.notesSub} -- ${bean.notesSub}   -- srv  修改数据 控制层实现
 * 
 * T${bean.numMain}${bean.numSub} ${bean.notesSub}
 * 
 * <p>
 * 创建时间：${bean.dayTime}
 * <p>
 * 
 * <p>
 * 修改时间：${bean.dayTime}
 * <p>
 * 
 * @author ${bean.author}
 * 
 * @version V1.0.0
 *
 */
@Component
public class Update${bean.javaFlieName}ServiceCtrl {


	/**
	 * V100(${bean.numTime}) ${bean.author} 初版。
	 */
	private static String verNum = "V100(${bean.numTime})";// 版本号

	@Autowired
	private AppSecretService appSecretService;
	@Autowired
	private OnsProducer onsProducer;
	@Autowired
	private Update${bean.javaFlieName}Service update${bean.javaFlieName}Service;
	@Autowired
    private StdBizExtExecuteService stdBizExtExecuteService;

	/*
	 * 日志 logger 名称
	 */
	private static String loggerName = ${bean.javaFlieName}CVal.LOGGER_NAME;

	/**
	 * 更新  ${bean.notesSub}  数据
	 * 
	 * 
	 * @date ${bean.dayTime}
	 * 
	 * @param loginInfo  登录信息
	 * @param bizData  提交参数 
	 * @return
	 */
	public String doAction(String loginInfo, String bizData) {
		String appSecret = appSecretService.getAppSecret();
		ResultObj resultObj = doAction(loginInfo, bizData, appSecret);
		resultObj.setEndTime();// 设置结束时间
		String resultString = ResultObjUtil.toJSONString(resultObj, appSecret);

		if (LogService.isInfoEnabled(loggerName)) {
			StringBuffer logBuff = new StringBuffer(200);
			logBuff.append(DateTimeUtil.getCurrentTime());
			logBuff.append(" Update${bean.javaFlieName}ServiceCtrl info: [\r\n");
			logBuff.append("loginInfo: ").append(loginInfo).append("\r\n");
			logBuff.append("  bizData: ").append(bizData).append("\r\n");
			logBuff.append("   result: ").append(resultString).append("\r\n");
			logBuff.append("] ================================================ end.");
			LogService.info(loggerName, logBuff.toString());
		}
		return resultString;
	}

	/**
	 * 更新  ${bean.notesSub}  数据
	 * 
	 * 
	 * @date ${bean.dayTime}
	 * 
	 * @param loginInfo  登录信息
	 * @param bizData  提交参数 
	 * @return
	 */
	private ResultObj doAction(String loginInfo, String bizData, String appSecret) {
		// ==================================================================================
		// ==================================================================================
		// ==================================================================================
		ResultObj resultObj = new ResultObj();
		resultObj.setVerNum(verNum);// 设置当前处理程序的版本号
		// 转换输入的登录信息数据格式
		LoginInfoObj loginInfoObj = LoginInfoUtil.fromJSONString(loginInfo, appSecret);
		try {
			// ==================================================================================
			// ==================================================================================
			// ==================================================================================
			String responseId = ResponseIdUtil.createId(${bean.javaFlieName}CVal.FUNC_ID);// 响应Id
			resultObj.setResponseId(responseId);// 设置响应Id
			resultObj.setLogBatchNo(LogBatchNoUtil.createId(${bean.javaFlieName}CVal.FUNC_ID));// 设置日志批次号
			// ==================================================================================
			// ==================================================================================
			// ==================================================================================
			// 基本数据检查
			String[] wantCheckIds = { CommonCVal.KEYNAME_DATASIGNATURE, CommonCVal.KEYNAME_USERID,
					CommonCVal.KEYNAME_REMOTE_CLIENT_ADDR, CommonCVal.KEYNAME_REQUESTID };
			String checkResult = LoginInfoBasicChecker.check1(loginInfoObj, wantCheckIds);
			if (checkResult != null) {
				resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID + checkResult);
				resultObj.setCodeValueERR();
				return resultObj;
			}
			// 请求Id
			resultObj.setRequestId(loginInfoObj.getRequestId());
			// 日志批次号
			if (loginInfoObj.getLogBatchNo() != null && loginInfoObj.getLogBatchNo().trim().length() >= 0) {
				// 如果调用者传入了 日志批次号 ，则使用调用者的 日志批次号
				resultObj.setLogBatchNo(loginInfoObj.getLogBatchNo());
			}
			// ==================================================================================
			// ==================================================================================
			// ==================================================================================
			// 这里暂时不增加用户操作权限检查，检查逻辑放在前端应用层。
			// ==================================================================================
			// ==================================================================================
			// ==================================================================================
			// 转换输入的业务数据格式
			Map<String, String> bizDataMap = BizDataUtil.fromJSONString(bizData, appSecret);
			// 基本数据检查
			String[] wantCheckIdsForBizData = {
				CommonCVal.KEYNAME_DATASIGNATURE,
				${bean.javaFlieName}CVal.KEYNAME_${(bean.pk01)?upper_case} ,
				${bean.javaFlieName}CVal.KEYNAME_${(bean.pk02)?upper_case}<#if (bean.pk03)!=""> ,
				${bean.javaFlieName}CVal.KEYNAME_${(bean.pk03)?upper_case}</#if><#if (bean.pk04)!=""> ,
				${bean.javaFlieName}CVal.KEYNAME_${(bean.pk04)?upper_case}</#if><#if (bean.pk05)!=""> ,
				${bean.javaFlieName}CVal.KEYNAME_${(bean.pk05)?upper_case}</#if><#if (bean.pk06)!=""> ,
				${bean.javaFlieName}CVal.KEYNAME_${(bean.pk06)?upper_case}</#if> ,
				CommonCVal.KEYNAME_OPRSEQFLAG
			};
			String[] bizDataCheckResult = BizDataBasicChecker.check1(bizDataMap, wantCheckIdsForBizData);
			if (bizDataCheckResult != null) {
				resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID + bizDataCheckResult[0]);
				resultObj.setMessage(bizDataCheckResult[1]);
				resultObj.setCodeValueERR();
				return resultObj;
			}
			// ==================================================================================
			// ==================================================================================
			// ==================================================================================
			// 简单数据处理
			String ${bean.pk01} = bizDataMap.get(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk01) ?upper_case});
			${bean.pk01} = ${bean.pk01}.trim().toUpperCase();// 去空格、转大写处理
			String ${bean.pk02} = bizDataMap.get(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk02) ?upper_case});
			${bean.pk02} = ${bean.pk02}.trim().toUpperCase();// 去空格、转大写处理
			<#if (bean.pk03)!="">
			String ${bean.pk03} = bizDataMap.get(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk03) ?upper_case});
			${bean.pk03} = ${bean.pk03}.trim().toUpperCase();// 去空格、转大写处理
			</#if>
			bizDataMap.put(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk01) ?upper_case}, ${(bean.pk01)});
			bizDataMap.put(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk02) ?upper_case}, ${(bean.pk02)});
			<#if (bean.pk03)!="">
			bizDataMap.put(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk03) ?upper_case}, ${(bean.pk03)});
			</#if>
			<#if (bean.pk04)!="">
			bizDataMap.put(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk04) ?upper_case}, ${(bean.pk04)});
			</#if>
			<#if (bean.pk05)!="">
			bizDataMap.put(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk05) ?upper_case}, ${(bean.pk05)});
			</#if>
			resultObj.setPkey01(${bean.pk01});// 记录PKey值返回给调用者使用
			resultObj.setPkey02(${bean.pk02});// 记录PKey值返回给调用者使用
			<#if (bean.pk03)!="">
			resultObj.setPkey03(${bean.pk03});// 记录PKey值返回给调用者使用
			</#if>
			<#if (bean.pk04)!="">
			resultObj.setPkey04(${bean.pk04});// 记录PKey值返回给调用者使用
			</#if>
			<#if (bean.pk05)!="">
			resultObj.setPkey05(${bean.pk05});// 记录PKey值返回给调用者使用
			</#if>
			
			//助记码处理
			
			// ==================================================================================
            // ==================================================================================
            // ==================================================================================
            // 20181201 jingdy 调用标准业务功能扩展逻辑 - 前置操作  EDT   DEL
            String functionId = ${bean.javaFlieName}CVal.FUNC_ID;
            String actionCode = "EDT"; // 默认使用 BSM_FUNCTION_ACTION.actionId 的值
            String extendType = CommonCVal.STDBIZ_EXT_TYPE_PRE; // 前置操作
            ResultObj resultObj_ext = stdBizExtExecuteService.execute(loginInfoObj, bizDataMap, 
                    functionId, actionCode, extendType);
            if (resultObj_ext.isCodeValueERR()) {
                // 前置操作执行失败
                resultObj.setMessageId(resultObj_ext.getMessageId());
                resultObj.setMessage(resultObj_ext.getMessage());
                resultObj.setCodeValueERR();
                return resultObj;               
            }

			// 活动标记
			String _FieldName;
			String _FieldValue;
			_FieldName = "activeFlag";
			_FieldValue = bizDataMap.get(_FieldName);
			if ("N".equalsIgnoreCase(_FieldValue)) {
				bizDataMap.put(_FieldName, "N");
			} else {
				bizDataMap.put(_FieldName, "Y");// 默认为 Y
			}

			// ==================================================================================
			// ==================================================================================
			// ==================================================================================
			// 查询对应的记录是否存在
			String otherReturnFields = "";
			Map<String, Object> ${(bean.javaFlieName)?uncap_first}Map = update${bean.javaFlieName}Service.get${bean.javaFlieName}(loginInfoObj, bizDataMap);
			if (SFHelper.isEmptyMap(${(bean.javaFlieName)?uncap_first}Map)) {
				// 如果${(bean.javaFlieName)?uncap_first}Map为空，或者大小小于等于0,说明数据库没有该条记录
				resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID + CommonCVal.ERRID_401);
				resultObj.setCodeValueERR();
				return resultObj;
			}
			
			// ==================================================================================
			// ==================================================================================
			// ==================================================================================
			Map<String, String> whereDataMap = new HashMap<String, String>();
			whereDataMap.put(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk01) ?upper_case},${(bean.pk02)});
			whereDataMap.put(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk02) ?upper_case}, ${(bean.pk02)});
	<#if (bean.pk03)!="">
			whereDataMap.put(${bean.javaFlieName}CVal.KEYNAME_${(bean.pk03) ?upper_case}, ${(bean.pk03)});
	</#if>
			whereDataMap.put(CommonCVal.KEYNAME_OPRSEQFLAG, bizDataMap.get(CommonCVal.KEYNAME_OPRSEQFLAG));// 旧的操作流水标记
			// 检查数据是否已经变更
			String oprSeqFlag_cur = (String) ${(bean.javaFlieName)?uncap_first}Map.get(CommonCVal.KEYNAME_OPRSEQFLAG);
			if (oprSeqFlag_cur.compareTo(bizDataMap.get(CommonCVal.KEYNAME_OPRSEQFLAG)) != 0) {
				// 计划更新的分支机构记录数据已经变化(需要刷新数据后重新提交请求)
				resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID + CommonCVal.ERRID_502);
				resultObj.setCodeValueERR();
				return resultObj;
			}
			// 更新版本号
			//jingdy  20180805  适应所有数据库
			int iCurrentVersion = SFHelper.toIntFM(${(bean.javaFlieName)?uncap_first}Map, CommonCVal.KEYNAME_CURRENT_VERSION);
//			Integer currentVersion_cur = (Integer) ${(bean.javaFlieName)?uncap_first}Map.get(CommonCVal.KEYNAME_CURRENT_VERSION);// 当前版本号
//			int iCurrentVersion = currentVersion_cur.intValue();
			if (iCurrentVersion <= 0) {
				iCurrentVersion = 100;
			}
			iCurrentVersion++;// 当前版本号+1
			bizDataMap.put(CommonCVal.KEYNAME_CURRENT_VERSION, "" + iCurrentVersion);// 当前版本号

			bizDataMap.put(CommonCVal.KEYNAME_OPRSEQFLAG, responseId);// 新的操作流水标记
			// ==================================================================================
			// ==================================================================================
			// ==================================================================================
			// 提交数据 (这里的所有操作放在一个事务中，如果没有异常则提交成功，否则提交失败，事务回滚)
			try {
				ResultObj resultObjTmp = update${bean.javaFlieName}Service.postData(loginInfoObj, bizDataMap, whereDataMap);

				if (resultObjTmp.isCodeValueERR()) {
					resultObj.setMessageId(resultObjTmp.getMessageId());
					resultObj.setMessage(resultObjTmp.getMessage());
					resultObj.setCodeValueERR();
					return resultObj;
				}
			} catch (RowDataException rowDataException) {
				resultObj.setMessageId(rowDataException.getMessageId());
				resultObj.setMessage(rowDataException.getMessage());
				resultObj.setExceptionString(rowDataException);
				resultObj.setCodeValueERR();
				return resultObj;
			} catch (Exception err1) {
				resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID + CommonCVal.ERRID_801);
				resultObj.setMessage(err1.getMessage());
				resultObj.setExceptionString(err1);
				resultObj.setCodeValueERR();
				return resultObj;
			}
			// ==================================================================================
            // ==================================================================================
            // ==================================================================================
            // 20181201 jingdy 调用标准业务功能扩展逻辑 - 后置操作
            extendType = CommonCVal.STDBIZ_EXT_TYPE_POST; // 后置操作
            resultObj_ext = stdBizExtExecuteService.execute(loginInfoObj, bizDataMap,functionId, actionCode, extendType);
            if (resultObj_ext.isCodeValueERR()) {
                // 后置操作执行失败
                resultObj.setMessageId(resultObj_ext.getMessageId());
                resultObj.setMessage(resultObj_ext.getMessage());
                resultObj.setCodeValueERR();
                return resultObj;               
            }
			// ==================================================================================
			// ==================================================================================
			// ==================================================================================
			// 操作成功
			resultObj.setCodeValueOK();
			// ==================================================================================
			// ==================================================================================
			// ==================================================================================
		} catch (UncategorizedSQLException err) {
		//	err.printStackTrace();
			BizHelper.setFinalRetInfo(resultObj, err,${bean.javaFlieName}CVal.FUNC_ID,loginInfoObj);
			resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID + CommonCVal.ERRID_800);
			resultObj.setMessage(err.getMessage());
			resultObj.setExceptionString(err);
			resultObj.setCodeValueERR();
		} catch (Exception err) {
		//	err.printStackTrace();
			BizHelper.setFinalRetInfo(resultObj, err,${bean.javaFlieName}CVal.FUNC_ID,loginInfoObj);
			resultObj.setMessageId(${bean.javaFlieName}CVal.FUNC_ID + CommonCVal.ERRID_500);
			resultObj.setMessage(err.getMessage());
			resultObj.setExceptionString(err);
			resultObj.setCodeValueERR();
		} finally {
			// ==================================================================================
			// ==================================================================================
			// ==================================================================================
			try {
				// 发送一条日志消息
				resultObj.setEndTime();// 设置结束时间
				String resultString = ResultObjUtil.toJSONString(resultObj, appSecret);

				OnsMessageObj onsMessageObj = new OnsMessageObj(loginInfo, bizData, resultString);
				String tags = ${bean.javaFlieName}CVal.FUNC_ID;
				String key = resultObj.getResponseId();
				onsMessageObj.setTags(tags);
				onsMessageObj.setKey(key);
				String onsMessageId = onsProducer.sendMessage(onsMessageObj.toJSONString(), tags, key);
				resultObj.setOnsMessageId(onsMessageId);// 记录 ONS
														// 返回的消息Id，后面会记录到日志文件中
			} catch (Exception err) {
				err.printStackTrace();
			}
			// ==================================================================================
			// ==================================================================================
			// ==================================================================================
		}
		// ==================================================================================
		// ==================================================================================
		// ==================================================================================
		return resultObj;
		// ==================================================================================
		// ==================================================================================
		// ==================================================================================
	}

}
